#pragma once

#include "Sock.hpp"
#include <vector>
#include <functional>
#include <pthread.h>

namespace NS_TcpServer
{
    // 表示函数类型
    // typedef std::function<void(int)> func_t;
    using func_t = std::function<void(int)>;

    class TcpServer;

    class ThreadData
    {
        // 存储套接字和对应的TCP服务器对象的指针
    public:
        ThreadData(int sock, TcpServer* server): _sock(sock),_server(server) {}
        ~ThreadData() {}
    public:
        int _sock;
        TcpServer *_server;
    };


    class TcpServer
    {
    public: // 默认成员函数
        TcpServer(int port);
        ~TcpServer() 
        {
            if(_listenSock >= 0)
                close(_listenSock);
        }

    private: // 成员变量
        int _listenSock;
        Sock _sock;
        std::vector<func_t> _funcs;

    private:
        static void *ThreadRoutine(void* args) // 处理客户端连接
        {
            pthread_detach(pthread_self()); // 将当前线程标记为可分离的: 可分离的线程在退出时会自动释放其资源
            ThreadData* td = static_cast<ThreadData*>(args); // 确保 args 指向的是 ThreadData 类型
            td->_server->Excute(td->_sock); // 调用 TcpServer 的 Excute 函数
            // delete td;
            return nullptr;
        }

    public: // 成员函数

        void BindService(func_t func){ // 注册处理函数，并添加到_funcs
            _funcs.push_back(func);
        }

        void Excute(int sock) // 执行_funcs中的所有处理函数
        {
            for(auto func : _funcs)
                func(sock);
        }

        void Start() // 服务启动
        {
            while(1) // 持续接收客户端 请求
            {
                string client_ip;
                uint16_t client_port;
                int sock = _sock.Accept(_listenSock, &client_ip, &client_port);
                if(sock < 0)
                {
                    perror("Accept");
                    continue;
                }

                logMessage(NORMAL, "create new link successful, sock: ", sock);
                pthread_t tid;
                ThreadData* td = new ThreadData(sock, this);
                pthread_create(&tid, nullptr, ThreadRoutine, td);
            }
        }
    };

    
}